within ;
model Lager_3

 //PARAMETER
 parameter Integer produktivitaet = 1;
 parameter Integer anpassungszeit = 12; //Wochen
 parameter Integer lagerkorrekturzeit = 8; //Wochen

 parameter Integer delay1 = 10;
 parameter Integer delay2 = 2;
 parameter Integer delay3 = 3;

 //VARIABLEN
 Real nettoanstellungsrate;
 Real produktion;
 Real arbeitskraeftesoll;
 Real solllagerbestand;
 Real sollproduktion;
 Real lagerbestand(start = 300);
 Real arbeitskraefte(start = 300);

 Real gesamtanforderung;
 Real gesamtanlieferung;

 Real anlieferung1;
 Real anlieferung2;
 Real anlieferung3;

 Real anforderung1;
 Real anforderung2;
 Real anforderung3;

 Real solllagerbestand1;
 Real solllagerbestand2;
 Real solllagerbestand3;

 Real lagerbestand1(start=50);
 Real lagerbestand2(start=100);
 Real lagerbestand3(start=70);

 Real sollverkauf1(start=75);
 Real sollverkauf2=5*mod(time,20);
 Real sollverkauf3=mod(10*sqrt(time),500);

 Real verkauf1;
 Real verkauf2;
 Real verkauf3;

equation
 der(lagerbestand) = produktion - gesamtanlieferung;
 der(arbeitskraefte) = nettoanstellungsrate;

 der(lagerbestand1) = anlieferung1 - verkauf1;
 der(lagerbestand2) = anlieferung2 - verkauf2;
 der(lagerbestand3) = anlieferung3 - verkauf3;

 nettoanstellungsrate = (arbeitskraeftesoll - arbeitskraefte) / anpassungszeit;
 produktion = arbeitskraefte * produktivitaet;
 arbeitskraeftesoll = sollproduktion / produktivitaet;
 solllagerbestand = 1.5 * gesamtanforderung;

 if lagerbestand < solllagerbestand then
   sollproduktion = gesamtanforderung + ((solllagerbestand - lagerbestand) / lagerkorrekturzeit);
 else
   sollproduktion = 0;
 end if;

 gesamtanforderung = anforderung1 + anforderung2 + anforderung3;

 solllagerbestand1 = 1 * sollverkauf1;
 solllagerbestand2 = 1.2 * sollverkauf2;
 solllagerbestand3 = 1.5 * sollverkauf3;

 if  gesamtanforderung > lagerbestand then
   gesamtanlieferung = lagerbestand;
 else
   gesamtanlieferung = gesamtanforderung;
 end if;

 anlieferung1 = anforderung1/gesamtanforderung * gesamtanlieferung;
 anlieferung2 = anforderung2/gesamtanforderung * gesamtanlieferung;
 anlieferung3 = anforderung3/gesamtanforderung * gesamtanlieferung;

 if lagerbestand1 <= solllagerbestand1 then
   anforderung1 = verkauf1 + ((solllagerbestand1 - lagerbestand1) / delay1);
 else
   anforderung1 = 0;
 end if;

 if lagerbestand2 <= solllagerbestand2 then
   anforderung2 = verkauf2 + ((solllagerbestand2 - lagerbestand2) / delay2);
 else
   anforderung2 = 0;
 end if;

 if lagerbestand3 <= solllagerbestand3 then
   anforderung3 = verkauf3 + ((solllagerbestand3 - lagerbestand3) / delay3);
 else
   anforderung3 = 0;
 end if;

 if  lagerbestand1 < sollverkauf1 then
   verkauf1 = lagerbestand1;
 else
   verkauf1 = sollverkauf1;
 end if;

 if  lagerbestand2 < sollverkauf2 then
   verkauf2 = lagerbestand2;
 else
   verkauf2 = sollverkauf2;
 end if;

 if  lagerbestand3 < sollverkauf3 then
   verkauf3 = lagerbestand3;
 else
   verkauf3 = sollverkauf3;
 end if;

 when time >= 50 then
   sollverkauf1 =  150;
 end when;

 annotation (
   experiment(StopTime=100),
   experimentSetupOutput,
   uses(Modelica(version="3.0")),
    DymolaStoredErrors);
end Lager_3;
